# -*- coding: utf-8 -*-
# 如果你的程序（包括注释）中包含中文，请加上上面这一行，用于指明编码（utf-8）。
# #号开头的行都是注释。

# 如何编辑本程序：
#     用任何文本编辑器均可编辑。

# 如何运行本程序：
#     在终端中，运行：python p301_function.py

# 最简单的函数定义，没有参数：
def greet_user():
    '''显示简单的问候语。
    三个引号可用于多行注释。
    '''
    # 注意缩进。
    print('Hello')
    
# 对函数的调用：
greet_user()

# 有一个参数的函数：
# 函数定义中的参数叫做：形参
def greet_user(user_name):
    '''参数user_name必须是一个字符串。
    '''
    # 注意缩进。
    print('Hello, ' + user_name.title() + '!')

# 调用有形参的函数时，需要指定实参。 
greet_user('zhang lao san')
greet_user('wang lao wu')


# 多个参数的函数：
def speak_language(user_name, language_name):
    print(user_name.title() + ' speaks ' + language_name.title())

# 实参的传递：位置实参，顺序重要
speak_language('alice', 'chinese')
speak_language('bob', 'english')

# 实参的传递：关键字实参，顺序不重要
speak_language(user_name = 'mary', language_name = 'chinese')
speak_language(language_name = 'chinese', user_name = 'mary')
  

# 参数有默认值的函数：
# 指定默认值的参数应放在最后，否则调用的时候只能用关键字实参。
def write_program(person, lang = 'python'):
    print(person.title() + ' writes programs in ' + lang.title())
    
write_program('charlie')
write_program('david', 'java')


# 传递任意数量的实参：
def make_pizza(size, *toppings):
    '''打印顾客点的所有配料。'''
    #print(type(toppings))  # 'tuple'
    print('\nMaking a ' + str(size) + '-inch pizza with the following toppings:')
    for t in toppings:
        print('- ' + t)
        
make_pizza(8, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

print()

# 传递任意数量的关键字实参：
def build_profile(first, last, **user_info):
    #print(type(user_info)) # 'dict'
    profile = {}
    profile['first_name'] = first
    profile['last_name'] = last
    for key, value in user_info.items():
        profile[key] = value
    return profile
    
user_profile = build_profile('albert', 'einstein',
    location='princeton', field='physics')
print(user_profile)























